<?php
namespace Home\Controller;
use Think\Controller;

/* *
 * 类名：AlipaySubmit
 * 功能：支付宝各接口请求提交类
 * 详细：构造支付宝各接口表单HTML文本，获取远程HTTP数据
 * 版本：3.3
 * 日期：2012-07-23
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
 */
require_once("alipay/lib/alipay_core.function.php");
require_once("alipay/lib/alipay_md5.function.php");

class AlipaySubmit {

    var $alipay_config;
    /**
     *支付宝网关地址（新）
     */
    var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';

    function __construct($alipay_config){
        $this->alipay_config = $alipay_config;
    }
    function AlipaySubmit($alipay_config) {
        $this->__construct($alipay_config);
    }

    /**
     * 生成签名结果
     * @param $para_sort 已排序要签名的数组
     * return 签名结果字符串
     */
    function buildRequestMysign($para_sort) {
        //把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = createLinkstring($para_sort);

        $mysign = "";
        switch (strtoupper(trim($this->alipay_config['sign_type']))) {
            case "MD5" :
                $mysign = md5Sign($prestr, $this->alipay_config['key']);
                break;
            default :
                $mysign = "";
        }

        return $mysign;
    }

    /**
     * 生成要请求给支付宝的参数数组
     * @param $para_temp 请求前的参数数组
     * @return 要请求的参数数组
     */
    function buildRequestPara($para_temp) {
        //除去待签名参数数组中的空值和签名参数
        $para_filter = paraFilter($para_temp);

        //对待签名参数数组排序
        $para_sort = argSort($para_filter);

        //生成签名结果
        $mysign = $this->buildRequestMysign($para_sort);

        //签名结果与签名方式加入请求提交参数组中
        $para_sort['sign'] = $mysign;
        $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));

        return $para_sort;
    }

    /**
     * 生成要请求给支付宝的参数数组
     * @param $para_temp 请求前的参数数组
     * @return 要请求的参数数组字符串
     */
    function buildRequestParaToString($para_temp) {
        //待请求参数数组
        $para = $this->buildRequestPara($para_temp);

        //把参数组中所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串，并对字符串做urlencode编码
        $request_data = createLinkstringUrlencode($para);

        return $request_data;
    }

    /**
     * 建立请求，以表单HTML形式构造（默认）
     * @param $para_temp 请求参数数组
     * @param $method 提交方式。两个值可选：post、get
     * @param $button_name 确认按钮显示文字
     * @return 提交表单HTML文本
     */
    function buildRequestForm($para_temp, $method, $button_name) {
        //待请求参数数组
        $para = $this->buildRequestPara($para_temp);

        $sHtml = "<meta http-equiv='content-type' content='text/html; charset=utf-8'><form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
        while (list ($key, $val) = each ($para)) {
            $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
        }

        //submit按钮控件请不要含有name属性
        $sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>";

        $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";

        return $sHtml;
    }

    /**
     * 建立请求，以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
     * @param $para_temp 请求参数数组
     * @return 支付宝处理结果
     */
    function buildRequestHttp($para_temp) {
        $sResult = '';

        //待请求参数数组字符串
        $request_data = $this->buildRequestPara($para_temp);

        //远程获取数据
        $sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'],$request_data,trim(strtolower($this->alipay_config['input_charset'])));

        return $sResult;
    }

    /**
     * 建立请求，以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果，带文件上传功能
     * @param $para_temp 请求参数数组
     * @param $file_para_name 文件类型的参数名
     * @param $file_name 文件完整绝对路径
     * @return 支付宝返回处理结果
     */
    function buildRequestHttpInFile($para_temp, $file_para_name, $file_name) {

        //待请求参数数组
        $para = $this->buildRequestPara($para_temp);
        $para[$file_para_name] = "@".$file_name;

        //远程获取数据
        $sResult = getHttpResponsePOST($this->alipay_gateway_new, $this->alipay_config['cacert'],$para,trim(strtolower($this->alipay_config['input_charset'])));

        return $sResult;
    }

    /**
     * 用于防钓鱼，调用接口query_timestamp来获取时间戳的处理函数
     * 注意：该功能PHP5环境及以上支持，因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
     * return 时间戳字符串
     */
    function query_timestamp() {
        $url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->alipay_config['partner']))."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));
        $encrypt_key = "";

        $doc = new DOMDocument();
        $doc->load($url);
        $itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
        $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;

        return $encrypt_key;
    }
}

class AlipayNotify {
    /**
     * HTTPS形式消息验证地址
     */
    var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
    /**
     * HTTP形式消息验证地址
     */
    var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';
    var $alipay_config;

    function __construct($alipay_config){
        $this->alipay_config = $alipay_config;
    }
    function AlipayNotify($alipay_config) {
        $this->__construct($alipay_config);
    }
    /**
     * 针对notify_url验证消息是否是支付宝发出的合法消息
     * @return 验证结果
     */
    function verifyNotify(){
        if(empty($_POST)) {//判断POST来的数组是否为空
            return false;
        }
        else {
            //生成签名结果
            $isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
            //获取支付宝远程服务器ATN结果（验证是否是支付宝发来的消息）
            $responseTxt = 'false';
            if (! empty($_POST["notify_id"])) {$responseTxt = $this->getResponse($_POST["notify_id"]);}

            //写日志记录
            //if ($isSign) {
            //	$isSignStr = 'true';
            //}
            //else {
            //	$isSignStr = 'false';
            //}
            //$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";
            //$log_text = $log_text.createLinkString($_POST);
            //logResult($log_text);

            //验证
            //$responsetTxt的结果不是true，与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
            //isSign的结果不是true，与安全校验码、请求时的参数格式（如：带自定义参数等）、编码格式有关
            if (preg_match("/true$/i",$responseTxt) && $isSign) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 针对return_url验证消息是否是支付宝发出的合法消息
     * @return 验证结果
     */
    function verifyReturn(){
        if(empty($_GET)) {//判断POST来的数组是否为空
            return false;
        }
        else {
            //生成签名结果
            $isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
            //获取支付宝远程服务器ATN结果（验证是否是支付宝发来的消息）
            $responseTxt = 'false';
            if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}

            //写日志记录
            //if ($isSign) {
            //	$isSignStr = 'true';
            //}
            //else {
            //	$isSignStr = 'false';
            //}
            //$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
            //$log_text = $log_text.createLinkString($_GET);
            //logResult($log_text);

            //验证
            //$responsetTxt的结果不是true，与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
            //isSign的结果不是true，与安全校验码、请求时的参数格式（如：带自定义参数等）、编码格式有关
            if (preg_match("/true$/i",$responseTxt) && $isSign) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 获取返回时的签名验证结果
     * @param $para_temp 通知返回来的参数数组
     * @param $sign 返回的签名结果
     * @return 签名验证结果
     */
    function getSignVeryfy($para_temp, $sign) {
        //除去待签名参数数组中的空值和签名参数
        $para_filter = paraFilter($para_temp);

        //对待签名参数数组排序
        $para_sort = argSort($para_filter);

        //把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = createLinkstring($para_sort);

        $isSgin = false;
        switch (strtoupper(trim($this->alipay_config['sign_type']))) {
            case "MD5" :
                $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
                break;
            default :
                $isSgin = false;
        }

        return $isSgin;
    }

    /**
     * 获取远程服务器ATN结果,验证返回URL
     * @param $notify_id 通知校验ID
     * @return 服务器ATN结果
     * 验证结果集：
     * invalid命令参数不对 出现这个错误，请检测返回处理中partner和key是否为空
     * true 返回正确信息
     * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
     */
    function getResponse($notify_id) {
        $transport = strtolower(trim($this->alipay_config['transport']));
        $partner = trim($this->alipay_config['partner']);
        $veryfy_url = '';
        if($transport == 'https') {
            $veryfy_url = $this->https_verify_url;
        }
        else {
            $veryfy_url = $this->http_verify_url;
        }
        $veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
        $responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);

        return $responseTxt;
    }
}

class PayController extends Controller{

    //doalipay方法
    public function doalipay(){
        //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        //合作身份者id，以2088开头的16位纯数字
        $alipay_config['partner']		= '2088121374147165';
        //收款支付宝账号，一般情况下收款账号就是签约账号
        $alipay_config['seller_email']	= '2287580716@qq.com';
        //安全检验码，以数字和字母组成的32位字符
        $alipay_config['key']			= 'b5bdaofkfg6ws163dnt8kpt4tla2tjhs';
        //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        //签名方式 不需修改
        $alipay_config['sign_type']    = strtoupper('MD5');
        //字符编码格式 目前支持 gbk 或 utf-8
        $alipay_config['input_charset']= strtolower('utf-8');
        //ca证书路径地址，用于curl中ssl校验
        //请保证cacert.pem文件在当前文件夹目录中
        $alipay_config['cacert']    = getcwd().'\\cacert.pem';
        //访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
        $alipay_config['transport']    = 'http';

        /* *
         * 功能：即时到账交易接口接入页
         * 版本：3.3
         * 修改日期：2012-07-23
         * 说明：
         * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
         * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

         *************************注意*************************
         * 如果您在接口集成过程中遇到问题，可以按照下面的途径来解决
         * 1、商户服务中心（https://b.alipay.com/support/helperApply.htm?action=consultationApply），提交申请集成协助，我们会有专业的技术工程师主动联系您协助解决
         * 2、商户帮助中心（http://help.alipay.com/support/232511-16307/0-16307.htm?sh=Y&info_type=9）
         * 3、支付宝论坛（http://club.alipay.com/read-htm-tid-8681712.html）
         * 如果不想使用扩展功能请把扩展功能参数赋空值。
         */
        /**************************请求参数**************************/

        //支付类型
        $payment_type = "1";
        //必填，不能修改
        //服务器异步通知页面路径
        $notify_url = "http://www.chaolaoshi.com/Home/pay/notify_url";
        //需http://格式的完整路径，不能加?id=123这类自定义参数

        //页面跳转同步通知页面路径
        $return_url = "http://www.chaolaoshi.com/Home/pay/returnurl";
        //需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/

        //商户订单号
        $out_trade_no = $_POST['WIDout_trade_no'];
        //商户网站订单系统中唯一订单号，必填

        //订单名称
        $subject = $_POST['trade_name'];
        //必填

        //通过订单计算金额
        $trade_no_arr = array(0=>substr($out_trade_no,0,16),1=>substr($out_trade_no,16,3));
        $map['order_form.order_sn'] = $trade_no_arr[0];
        $map['order_form.renew'] = $trade_no_arr[1];
        $result = M("order_form")->join('LEFT JOIN requirement r ON r.id = order_form.requirement_id')
            ->where($map)->find();
        $pr['is_certified'] = $_POST['is_certified'];
        $pr['grade'] = $result['grade'];
        $rs = M("course_price")->where($pr)->find();
        //生成账单价格历史
        $CoursePriceHistory = M("course_price_history");
        $datah['order_sn'] = $map['order_form.order_sn'];
        $datah['total_course']  = $_POST['coursenum'];
        $datah['remain_course'] = $_POST['coursenum'];
        $datah['parent_price']  = $rs['price'];
        $datah['teacher_price'] = $rs['teachprice'];
        $datah['is_over'] = 1;
        $CoursePriceHistory->add($datah);
        //付款金额
        $total_fee = $rs['price']*$_POST['coursenum'];
        //必填
        //订单描述
        $body = $_POST['coursenum']."_".session('id');//$_POST['WIDbody'];
        //商品展示地址
        $show_url = "http://www.chaolaoshi.com/Home/Index/teacherList";
        //需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html

        //防钓鱼时间戳
        $anti_phishing_key = "";
        //若要使用请调用类文件submit中的query_timestamp函数

        //客户端的IP地址
        $exter_invoke_ip = "";
        //非局域网的外网IP地址，如：221.0.0.1


        /************************************************************/

//构造要请求的参数数组，无需改动
        $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => trim($alipay_config['partner']),
            "seller_email" => trim($alipay_config['seller_email']),
            "payment_type"	=> $payment_type,
            "notify_url"	=> $notify_url,
            "return_url"	=> $return_url,
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "total_fee"	=> $total_fee,
            "body"	=> $body,
            "show_url"	=> $show_url,
            "anti_phishing_key"	=> $anti_phishing_key,
            "exter_invoke_ip"	=> $exter_invoke_ip,
            "_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );
        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
    }

    /******************************
    服务器异步通知页面方法
    其实这里就是将notify_url.php文件中的代码复制过来进行处理

     *******************************/
    function notifyurl(){
        //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        //合作身份者id，以2088开头的16位纯数字
        $alipay_config['partner']		= '2088121374147165';
        //收款支付宝账号，一般情况下收款账号就是签约账号
        $alipay_config['seller_email']	= '2287580716@qq.com';
        //安全检验码，以数字和字母组成的32位字符
        $alipay_config['key']			= 'b5bdaofkfg6ws163dnt8kpt4tla2tjhs';
        //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        //签名方式 不需修改
        $alipay_config['sign_type']    = strtoupper('MD5');
        //字符编码格式 目前支持 gbk 或 utf-8
        $alipay_config['input_charset']= strtolower('utf-8');
        //ca证书路径地址，用于curl中ssl校验
        //请保证cacert.pem文件在当前文件夹目录中
        $alipay_config['cacert']    = getcwd().'\\cacert.pem';
        //访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
        $alipay_config['transport']    = 'http';

        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];
            //支付宝交易号
            $trade_no = $_GET['trade_no'];
            //交易状态
            $trade_status = $_GET['trade_status'];


            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
                $bodyarr = explode('_',$_REQUEST['body']);
                $orderform = M("order_form");
                $trade_no_arr = array(0=>substr($out_trade_no,0,16),1=>substr($out_trade_no,16,3));
                if($trade_no_arr[1]=='000'){
                    //0.查询订单是否未支付
                    $map['order_sn'] = $trade_no_arr['0'];
                    $result = $orderform->where($map)->find();
                    if($result['status']==2){
                        //1.修改订单状态
                        $orderform = M("order_form");
                        $data['coursenum'] = $result['coursenum']+ $bodyarr[0];
                        $data['status'] = 3;
                        $data['renew'] = 1;
                        $orderform->where($map)->save($data);
                        //2.有效账单价格历史
                        $CoursePriceHistory = M("course_price_history");
                        $datah['is_over'] = 0;
                        $rs = $CoursePriceHistory->save($datah);
                        //3.生成订单记录
                        $orderlog = M("orderlog"); // 实例化User对象
                        $data['order_sn'] = $out_trade_no;
                        $data['alipay_sn'] = $trade_no;
                        $data['status'] = $trade_status;
                        $data['money'] = $_REQUEST['total_fee'];
                        $data['coursenum'] = $data['coursenum'];
                        $data['addtime'] = date("Y-m-d H:i:s");
                        $data['user_id'] = $bodyarr[1];
                        $rs = $orderlog->add($data);
                        if($rs){
                            echo 1;
                        }
                    }
                }else{
                    //0.查询订单是否未支付
                    $map['order_sn'] = $trade_no_arr['0'];
                    $result = $orderform->where($map)->find();
                    if($result['status']==3){
                        //1.修改订单状态
                        $orderform = M("order_form");
                        $data['coursenum'] = $result['coursenum'] + $bodyarr[0];
                        $data['renew'] = $result['renew'] + 1;
                        $orderform->where($map)->save($data);
                        //2.有效账单价格历史
                        $CoursePriceHistory = M("course_price_history");
                        $datah['is_over'] = 0;
                        $rs = $CoursePriceHistory->save($datah);
                        //3.生成订单记录
                        $orderlog = M("orderlog"); // 实例化User对象
                        $data['order_sn'] = $out_trade_no;
                        $data['alipay_sn'] = $trade_no;
                        $data['status'] = $trade_status;
                        $data['money'] = $_REQUEST['total_fee'];
                        $data['coursenum'] = $data['coursenum'];
                        $data['addtime'] = date("Y-m-d H:i:s");
                        $data['user_id'] = $bodyarr[1];
                        $rs = $orderlog->add($data);
                        if($rs){
                            echo 1;
                        }
                    }
                }
            }
            else {
                echo 0;
            }
            echo 1;
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo 0;
        }
    }

    /*
        页面跳转处理方法；
        这里其实就是将return_url.php这个文件中的代码复制过来，进行处理；
        */
    function returnurl(){
        //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        //合作身份者id，以2088开头的16位纯数字
        $alipay_config['partner']		= '2088121374147165';
        //收款支付宝账号，一般情况下收款账号就是签约账号
        $alipay_config['seller_email']	= '2287580716@qq.com';
        //安全检验码，以数字和字母组成的32位字符
        $alipay_config['key']			= 'b5bdaofkfg6ws163dnt8kpt4tla2tjhs';
        //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        //签名方式 不需修改
        $alipay_config['sign_type']    = strtoupper('MD5');
        //字符编码格式 目前支持 gbk 或 utf-8
        $alipay_config['input_charset']= strtolower('utf-8');
        //ca证书路径地址，用于curl中ssl校验
        //请保证cacert.pem文件在当前文件夹目录中
        $alipay_config['cacert']    = getcwd().'\\cacert.pem';
        //访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
        $alipay_config['transport']    = 'http';

        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码
            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];
            //支付宝交易号
            $trade_no = $_GET['trade_no'];
            //交易状态
            $trade_status = $_GET['trade_status'];


            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
                $bodyarr = explode('_',$_REQUEST['body']);
                $orderform = M("order_form");
                $trade_no_arr = array(0=>substr($out_trade_no,0,16),1=>substr($out_trade_no,16,3));
                if($trade_no_arr[1]=='000'){
                    //0.查询订单是否未支付
                    $map['order_sn'] = $trade_no_arr['0'];
                    $result = $orderform->where($map)->find();
                    if($result['status']==2){
                        //1.修改订单状态
                        $orderform = M("order_form");
                        $data['coursenum'] = $result['coursenum']+$bodyarr[0];
                        $data['status'] = 3;
                        $data['renew'] = 1;
                        $orderform->where($map)->save($data);
                        //2.有效账单价格历史
                        $CoursePriceHistory = M("course_price_history");
                        $maph['order_sn']=$trade_no_arr['0'];
                        $datah['is_over'] = 0;
                        $rs = $CoursePriceHistory->where($maph)->save($datah);
                        //3.生成订单记录
                        $orderlog = M("orderlog"); // 实例化User对象
                        $data['order_sn'] = $out_trade_no;
                        $data['alipay_sn'] = $trade_no;
                        $data['status'] = $trade_status;
                        $data['money'] = $_REQUEST['total_fee'];
                        $data['coursenum'] = $data['coursenum'];
                        $data['addtime'] = date("Y-m-d H:i:s");
                        $data['user_id'] = $bodyarr[1];
                        $rs = $orderlog->add($data);
                        if($rs){
                            redirect('/Home/Order/studentorder');
                        }
                    }
                }else{
                    //0.查询订单是否未支付
                    $map['order_sn'] = $trade_no_arr['0'];
                    $result = $orderform->where($map)->find();
                    if($result['status']==3){
                        //1.修改订单状态
                        $orderform = M("order_form");
                        $data['coursenum'] = $result['coursenum'] + $bodyarr[0];
                        $data['renew'] = $result['renew'] + 1;
                        $orderform->where($map)->save($data);
                        //2.有效账单价格历史
                        $CoursePriceHistory = M("course_price_history");
                        $maph['order_sn']=$trade_no_arr['0'];
                        $datah['is_over'] = 0;
                        $rs = $CoursePriceHistory->where($maph)->save($datah);
                        //3.生成订单记录
                        $orderlog = M("orderlog"); // 实例化User对象
                        $data['order_sn'] = $out_trade_no;
                        $data['alipay_sn'] = $trade_no;
                        $data['status'] = $trade_status;
                        $data['money'] = $_REQUEST['total_fee'];
                        $data['coursenum'] = $data['coursenum'];
                        $data['addtime'] = date("Y-m-d H:i:s");
                        $data['user_id'] = $bodyarr[1];
                        $rs = $orderlog->add($data);
                        if($rs){
                            redirect('/Home/Order/studentorder');
                        }
                    }
                }
            }
            else {
                echo "trade_status=".$_GET['trade_status'];
            }
            echo "验证成功<br />";
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo "验证失败";
        }
    }
}
?>